๐๏ธGitะฏัะฐ๐๏ธ
Node / meshtastic / Meshtastic-Android / files / core / ui / src / commonMain / kotlin / org / meshtastic / core / ui / emoji / EmojiPickerDialog.kt
Displaying Raw โข Download
core/ui/src/commonMain/kotlin/org/meshtastic/core/ui/emoji/EmojiPickerDialog.kt 2d20cd8a4708e2ef66e98d5259f3a97ec93f240a (2d20cd8a) Text, 31.13 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tf0883e@fileTb4b4b4:Te6edf3OptInTb4b4b4(Te6edf3ExperimentalMaterial3ApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72package T7ee787org.meshtastic.core.ui.emoji
Tff7b72import T7ee787androidx.compose.animation.AnimatedVisibility
Tff7b72import T7ee787androidx.compose.animation.fadeIn
Tff7b72import T7ee787androidx.compose.animation.fadeOut
Tff7b72import T7ee787androidx.compose.foundation.BorderStroke
Tff7b72import T7ee787androidx.compose.foundation.ExperimentalFoundationApi
Tff7b72import T7ee787androidx.compose.foundation.background
Tff7b72import T7ee787androidx.compose.foundation.clickable
Tff7b72import T7ee787androidx.compose.foundation.combinedClickable
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.PaddingValues
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.size
Tff7b72import T7ee787androidx.compose.foundation.layout.widthIn
Tff7b72import T7ee787androidx.compose.foundation.lazy.grid.GridCells
Tff7b72import T7ee787androidx.compose.foundation.lazy.grid.GridItemSpan
Tff7b72import T7ee787androidx.compose.foundation.lazy.grid.LazyVerticalGrid
Tff7b72import T7ee787androidx.compose.foundation.lazy.grid.rememberLazyGridState
Tff7b72import T7ee787androidx.compose.foundation.shape.CircleShape
Tff7b72import T7ee787androidx.compose.foundation.shape.RoundedCornerShape
Tff7b72import T7ee787androidx.compose.material3.CircularProgressIndicator
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3Api
Tff7b72import T7ee787androidx.compose.material3.Icon
Tff7b72import T7ee787androidx.compose.material3.IconButton
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.ModalBottomSheet
Tff7b72import T7ee787androidx.compose.material3.PrimaryScrollableTabRow
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Tab
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.material3.TextField
Tff7b72import T7ee787androidx.compose.material3.TextFieldDefaults
Tff7b72import T7ee787androidx.compose.material3.rememberModalBottomSheetState
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.collectAsState
Tff7b72import T7ee787androidx.compose.runtime.derivedStateOf
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.saveable.rememberSaveable
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.runtime.snapshotFlow
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.draw.clip
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.text.style.TextAlign
Tff7b72import T7ee787androidx.compose.ui.text.style.TextOverflow
Tff7b72import T7ee787androidx.compose.ui.tooling.preview.PreviewLightDark
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.compose.ui.unit.sp
Tff7b72import T7ee787androidx.compose.ui.window.Popup
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.koin.compose.viewmodel.koinViewModel
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.clear
Tff7b72import T7ee787org.meshtastic.core.resources.search_emoji
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Close
Tff7b72import T7ee787org.meshtastic.core.ui.icon.MeshtasticIcons
Tff7b72import T7ee787org.meshtastic.core.ui.icon.Search
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
T8b949e// โโ Constants โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tff7b72private Tff7b72val Te6edf3GRID_MIN_CELL_SIZE Tff7b72= T79c0ff4T79c0ff4.Te6edf3dp
Tff7b72private Tff7b72const Tff7b72val Te6edf3EMOJI_FONT_SIZE Tff7b72= T79c0ff2T79c0ff4
Tff7b72private Tff7b72const Tff7b72val Te6edf3CATEGORY_HEADER_KEY_PREFIX Tff7b72= Ta5d6ff"Ta5d6ffheader_Ta5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3RECENTS_HEADER_KEY Tff7b72= Ta5d6ff"Ta5d6ffheader_recentsTa5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3RECENTS_KEY_PREFIX Tff7b72= Ta5d6ff"Ta5d6ffrecent_Ta5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3MAX_RECENTS Tff7b72= T79c0ff3T79c0ff0
Tff7b72private Tff7b72const Tff7b72val Te6edf3DEFAULT_QUICK_REACTION_COUNT Tff7b72= T79c0ff6
Tff7b72private Tff7b72const Tff7b72val Te6edf3SEARCH_DEBOUNCE_MS Tff7b72= T79c0ff1T79c0ff5T79c0ff0L
T8b949e/** Default quick-reaction emoji used when the user has no recents. */
Tff7b72private Tff7b72val Te6edf3DEFAULT_QUICK_REACTIONS Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffโค๏ธTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐ฎTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐ขTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4)
T8b949e// โโ Public API โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
T8b949e/**
* A fully-featured, cross-platform emoji picker dialog.
*
* Features:
* - **9 categories** with tab-strip navigation
* - **Recents** โ most-frequently-used emojis, persisted via [EmojiPickerViewModel]
* - **Search** โ filters the full catalog by keyword
* - **Per-emoji skin-tone popup** โ long-press on a skin-tone-capable emoji to choose a variant
* - **Selected-emoji highlighting** โ visually marks already-applied reactions
* - **Responsive grid** โ adapts column count to screen width (phones โ 8, desktop โ 12+)
*
* @param selectedEmojis Set of emoji strings already selected (e.g. applied reactions). Matched emojis are highlighted
* with a tinted background.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffEmojiPickerDialogTb4b4b4(
Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657Unit Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3selectedEmojisTb4b4b4: Te6edf3SetTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3emptySetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3onConfirmTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3viewModelTb4b4b4: Te6edf3EmojiPickerViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3isLoaded Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3isLoadedTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3loadError Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3loadErrorTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3searchQuery Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3debouncedQuery Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4}
Tff7b72var Te6edf3selectedCategoryIndex Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(T79c0ff0Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3preferredSkinToneIndex Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3preferredSkinToneIndexTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
T8b949e// Debounce search input to avoid per-keystroke filtering of 1870 emojis
Te6edf3LaunchedEffectTb4b4b4(Te6edf3searchQueryTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchQueryTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3debouncedQuery Tff7b72= Ta5d6ff"Ta5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3delayTb4b4b4(Te6edf3SEARCH_DEBOUNCE_MSTb4b4b4)
Te6edf3debouncedQuery Tff7b72= Te6edf3searchQuery
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3recentEmojis Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequencyTb4b4b4) Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3parseRecentsTb4b4b4(Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequencyTb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3ModalBottomSheetTb4b4b4(
Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4,
Te6edf3sheetState Tff7b72= Te6edf3rememberModalBottomSheetStateTb4b4b4(Te6edf3skipPartiallyExpanded Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3loadErrorTb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffUnable to load emojiTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3isLoadedTb4b4b4) Tb4b4b4{
Te6edf3EmojiPickerContentTb4b4b4(
Te6edf3searchQuery Tff7b72= Te6edf3searchQueryTb4b4b4,
Te6edf3debouncedQuery Tff7b72= Te6edf3debouncedQueryTb4b4b4,
Te6edf3onSearchQueryChange Tff7b72= Tb4b4b4{ Te6edf3searchQuery Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Te6edf3selectedCategoryIndex Tff7b72= Te6edf3selectedCategoryIndexTb4b4b4,
Te6edf3onCategorySelected Tff7b72= Tb4b4b4{ Te6edf3selectedCategoryIndex Tff7b72= Tffa657it Tb4b4b4}Tb4b4b4,
Te6edf3selectedEmojis Tff7b72= Te6edf3selectedEmojisTb4b4b4,
Te6edf3recentEmojis Tff7b72= Te6edf3recentEmojisTb4b4b4,
Te6edf3categories Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3categoriesTb4b4b4,
Te6edf3allEmojis Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3allEmojisTb4b4b4,
Te6edf3preferredSkinToneIndex Tff7b72= Te6edf3preferredSkinToneIndexTb4b4b4,
Te6edf3onSkinToneSelect Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3setPreferredSkinToneTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onEmojiSelected Tff7b72= Tb4b4b4{ Te6edf3emoji Tff7b72-Tff7b72>
Te6edf3recordSelectionTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3viewModelTb4b4b4)
Te6edf3onDismissTb4b4b4(Tb4b4b4)
Te6edf3onConfirmTb4b4b4(Te6edf3emojiTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3BoxTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(T79c0ff2T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4) Tb4b4b4{
Te6edf3CircularProgressIndicatorTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Returns the user's top quick-reaction emoji from recents, falling back to defaults.
*
* Call sites (e.g. message long-press menus) can use this to populate a dynamic quick-reaction row sourced from the
* user's actual usage patterns.
*/
Tf0883e@Composable
Tff7b72fun Td2a8ffrememberQuickReactionsTb4b4b4(Te6edf3countTb4b4b4: Tffa657Int Tff7b72= Te6edf3DEFAULT_QUICK_REACTION_COUNTTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tb4b4b4{
Tff7b72val Te6edf3viewModelTb4b4b4: Te6edf3EmojiPickerViewModel Tff7b72= Te6edf3koinViewModelTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3recents Tff7b72by
Te6edf3rememberTb4b4b4(Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequencyTb4b4b4) Tb4b4b4{ Te6edf3derivedStateOf Tb4b4b4{ Te6edf3parseRecentsTb4b4b4(Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequencyTb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72return Te6edf3rememberTb4b4b4(Te6edf3recentsTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3recentsTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3countTb4b4b4) Tb4b4b4{
Te6edf3recentsTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3countTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// Pad with defaults that aren't already in recents
Tff7b72val Te6edf3padded Tff7b72= Te6edf3recentsTb4b4b4.Te6edf3toMutableListTb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3default Tff7b72in Te6edf3DEFAULT_QUICK_REACTIONSTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3paddedTb4b4b4.Te6edf3size Tff7b72>Tff7b72= Te6edf3countTb4b4b4) Tff7b72break
Tff7b72if Tb4b4b4(Te6edf3default Tff7b72!in Te6edf3paddedTb4b4b4) Te6edf3paddedTb4b4b4.Te6edf3addTb4b4b4(Te6edf3defaultTb4b4b4)
Tb4b4b4}
Te6edf3paddedTb4b4b4.Te6edf3takeTb4b4b4(Te6edf3countTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Main Content โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffEmojiPickerContentTb4b4b4(
Te6edf3searchQueryTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3debouncedQueryTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3onSearchQueryChangeTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3selectedCategoryIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onCategorySelectedTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3selectedEmojisTb4b4b4: Te6edf3SetTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3recentEmojisTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3categoriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiCategoryTff7b72>Tb4b4b4,
Te6edf3allEmojisTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiTff7b72>Tb4b4b4,
Te6edf3preferredSkinToneIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onSkinToneSelectTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onEmojiSelectedTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3Column Tb4b4b4{
Te6edf3SearchBarTb4b4b4(Te6edf3query Tff7b72= Te6edf3searchQueryTb4b4b4, Te6edf3onQueryChange Tff7b72= Te6edf3onSearchQueryChangeTb4b4b4)
Te6edf3AnimatedVisibilityTb4b4b4(Te6edf3visible Tff7b72= Te6edf3searchQueryTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3enter Tff7b72= Te6edf3fadeInTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exit Tff7b72= Te6edf3fadeOutTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3CategoryTabStripTb4b4b4(
Te6edf3selectedIndex Tff7b72= Te6edf3selectedCategoryIndexTb4b4b4,
Te6edf3onCategorySelected Tff7b72= Te6edf3onCategorySelectedTb4b4b4,
Te6edf3hasRecents Tff7b72= Te6edf3recentEmojisTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3categories Tff7b72= Te6edf3categoriesTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3EmojiGridTb4b4b4(
Te6edf3searchQuery Tff7b72= Te6edf3debouncedQueryTb4b4b4,
Te6edf3selectedCategoryIndex Tff7b72= Te6edf3selectedCategoryIndexTb4b4b4,
Te6edf3onCategoryChanged Tff7b72= Te6edf3onCategorySelectedTb4b4b4,
Te6edf3selectedEmojis Tff7b72= Te6edf3selectedEmojisTb4b4b4,
Te6edf3recentEmojis Tff7b72= Te6edf3recentEmojisTb4b4b4,
Te6edf3categories Tff7b72= Te6edf3categoriesTb4b4b4,
Te6edf3allEmojis Tff7b72= Te6edf3allEmojisTb4b4b4,
Te6edf3preferredSkinToneIndex Tff7b72= Te6edf3preferredSkinToneIndexTb4b4b4,
Te6edf3onSkinToneSelect Tff7b72= Te6edf3onSkinToneSelectTb4b4b4,
Te6edf3onEmojiSelected Tff7b72= Te6edf3onEmojiSelectedTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Search Bar โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSearchBarTb4b4b4(Te6edf3queryTb4b4b4: Tffa657StringTb4b4b4, Te6edf3onQueryChangeTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3TextFieldTb4b4b4(
Te6edf3value Tff7b72= Te6edf3queryTb4b4b4,
Te6edf3onValueChange Tff7b72= Te6edf3onQueryChangeTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3heightTb4b4b4(T79c0ff5T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3placeholder Tff7b72= Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3search_emojiTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3maxLines Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3overflow Tff7b72= Te6edf3TextOverflowTb4b4b4.Te6edf3EllipsisTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3leadingIcon Tff7b72= Tb4b4b4{
Te6edf3IconTb4b4b4(Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3SearchTb4b4b4, Te6edf3contentDescription Tff7b72= Tff7b72nullTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff2T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3trailingIcon Tff7b72= Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3queryTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3IconButtonTb4b4b4(Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onQueryChangeTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3IconTb4b4b4(
Te6edf3imageVector Tff7b72= Te6edf3MeshtasticIconsTb4b4b4.Te6edf3CloseTb4b4b4,
Te6edf3contentDescription Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3clearTb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff2T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3singleLine Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3shape Tff7b72= Te6edf3RoundedCornerShapeTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3colors Tff7b72=
Te6edf3TextFieldDefaultsTb4b4b4.Te6edf3colorsTb4b4b4(
Te6edf3focusedContainerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceContainerHighTb4b4b4,
Te6edf3unfocusedContainerColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceContainerHighTb4b4b4,
Te6edf3focusedIndicatorColor Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4,
Te6edf3unfocusedIndicatorColor Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3textStyle Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e// โโ Category Tabs โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffCategoryTabStripTb4b4b4(
Te6edf3selectedIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onCategorySelectedTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3hasRecentsTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3categoriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiCategoryTff7b72>Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3tabOffset Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hasRecentsTb4b4b4) T79c0ff1 Tff7b72else T79c0ff0
Tff7b72val Te6edf3totalTabs Tff7b72= Te6edf3categoriesTb4b4b4.Te6edf3size Tff7b72+ Te6edf3tabOffset
Te6edf3PrimaryScrollableTabRowTb4b4b4(
Te6edf3selectedTabIndex Tff7b72= Te6edf3selectedIndexTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3edgePadding Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4,
Te6edf3divider Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3containerColor Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3repeatTb4b4b4(Te6edf3totalTabsTb4b4b4) Tb4b4b4{ Te6edf3index Tff7b72-Tff7b72>
Tff7b72val Te6edf3isRecents Tff7b72= Te6edf3hasRecents Tff7b72&Tff7b72& Te6edf3index Tff7b72=Tff7b72= T79c0ff0
Te6edf3TabTb4b4b4(
Te6edf3selected Tff7b72= Te6edf3selectedIndex Tff7b72=Tff7b72= Te6edf3indexTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onCategorySelectedTb4b4b4(Te6edf3indexTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3text Tff7b72= Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isRecentsTb4b4b4) Ta5d6ff"Ta5d6ff\Ta5d6ffuD83DTa5d6ff\Ta5d6ffuDD50Ta5d6ff" Tff7b72else Te6edf3categoriesTff7b72[Te6edf3index Tff7b72- Te6edf3tabOffsetTff7b72]Tb4b4b4.Te6edf3iconTb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff1T79c0ff8.Te6edf3spTb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Emoji Grid โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffEmojiGridTb4b4b4(
Te6edf3searchQueryTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3selectedCategoryIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onCategoryChangedTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3selectedEmojisTb4b4b4: Te6edf3SetTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3recentEmojisTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3categoriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiCategoryTff7b72>Tb4b4b4,
Te6edf3allEmojisTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiTff7b72>Tb4b4b4,
Te6edf3preferredSkinToneIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onSkinToneSelectTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onEmojiSelectedTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3gridState Tff7b72= Te6edf3rememberLazyGridStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3hasRecents Tff7b72= Te6edf3recentEmojisTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3tabOffset Tff7b72= Tff7b72if Tb4b4b4(Te6edf3hasRecentsTb4b4b4) T79c0ff1 Tff7b72else T79c0ff0
Tff7b72val Te6edf3gridItemsTb4b4b4: Te6edf3ListTff7b72<Te6edf3GridItemTff7b72> Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3searchQueryTb4b4b4, Te6edf3recentEmojisTb4b4b4, Te6edf3categoriesTb4b4b4, Te6edf3allEmojisTb4b4b4) Tb4b4b4{
Te6edf3buildGridItemsTb4b4b4(Te6edf3searchQueryTb4b4b4, Te6edf3recentEmojisTb4b4b4, Te6edf3categoriesTb4b4b4, Te6edf3allEmojisTb4b4b4)
Tb4b4b4}
Tff7b72var Te6edf3animationTargetIndex Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTff7b72<Tffa657Int?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4) Tb4b4b4}
T8b949e// Scroll to category when tab changes
Te6edf3LaunchedEffectTb4b4b4(Te6edf3selectedCategoryIndexTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchQueryTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72returnTf0883e@LaunchedEffect
Tff7b72if Tb4b4b4(Te6edf3selectedCategoryIndex Tff7b72=Tff7b72= Te6edf3animationTargetIndexTb4b4b4) Tff7b72returnTf0883e@LaunchedEffect
Tff7b72val Te6edf3targetKey Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3hasRecents Tff7b72&Tff7b72& Te6edf3selectedCategoryIndex Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3RECENTS_HEADER_KEY
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3catIndex Tff7b72= Te6edf3selectedCategoryIndex Tff7b72- Te6edf3tabOffset
Tff7b72if Tb4b4b4(Te6edf3catIndex Tff7b72in Te6edf3categoriesTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Te6edf3CATEGORY_HEADER_KEY_PREFIX Tff7b72+ Te6edf3catIndex
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tb4b4b4}
Te6edf3targetKeyTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3key Tff7b72-Tff7b72>
Tff7b72val Te6edf3itemIndex Tff7b72= Te6edf3gridItemsTb4b4b4.Te6edf3indexOfFirst Tb4b4b4{ Tffa657it Tff7b72is Te6edf3GridItemTb4b4b4.Te6edf3Header Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3key Tff7b72=Tff7b72= Te6edf3key Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3itemIndex Tff7b72>Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3animationTargetIndex Tff7b72= Te6edf3selectedCategoryIndex
Te6edf3gridStateTb4b4b4.Te6edf3animateScrollToItemTb4b4b4(Te6edf3itemIndexTb4b4b4)
Tb4b4b4} Tff7b72finally Tb4b4b4{
Te6edf3animationTargetIndex Tff7b72= Tff7b72null
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Sync tab selection with scroll position
Te6edf3LaunchedEffectTb4b4b4(Te6edf3gridStateTb4b4b4, Te6edf3searchQueryTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchQueryTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72returnTf0883e@LaunchedEffect
Te6edf3snapshotFlow Tb4b4b4{ Te6edf3gridStateTb4b4b4.Te6edf3firstVisibleItemIndex Tb4b4b4}
Tb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3firstVisible Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3animationTargetIndex Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tff7b72returnTf0883e@collect
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in Te6edf3firstVisible Te6edf3downTo T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3item Tff7b72= Te6edf3gridItemsTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3item Tff7b72is Te6edf3GridItemTb4b4b4.Te6edf3HeaderTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3newIndex Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3itemTb4b4b4.Te6edf3key Tff7b72=Tff7b72= Te6edf3RECENTS_HEADER_KEYTb4b4b4) Tb4b4b4{
T79c0ff0
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3catIdx Tff7b72= Te6edf3itemTb4b4b4.Te6edf3keyTb4b4b4.Te6edf3removePrefixTb4b4b4(Te6edf3CATEGORY_HEADER_KEY_PREFIXTb4b4b4)Tb4b4b4.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3catIdx Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Te6edf3catIdx Tff7b72+ Te6edf3tabOffset Tff7b72else Te6edf3selectedCategoryIndex
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3newIndex Tff7b72!Tff7b72= Te6edf3selectedCategoryIndexTb4b4b4) Tb4b4b4{
Te6edf3onCategoryChangedTb4b4b4(Te6edf3newIndexTb4b4b4)
Tb4b4b4}
Tff7b72break
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3LazyVerticalGridTb4b4b4(
Te6edf3state Tff7b72= Te6edf3gridStateTb4b4b4,
Te6edf3columns Tff7b72= Te6edf3GridCellsTb4b4b4.Te6edf3AdaptiveTb4b4b4(Te6edf3minSize Tff7b72= Te6edf3GRID_MIN_CELL_SIZETb4b4b4)Tb4b4b4,
Te6edf3contentPadding Tff7b72= Te6edf3PaddingValuesTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3verticalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3gridItemsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3item Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3itemTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3GridItemTb4b4b4.Te6edf3Header Tff7b72-Tff7b72>
Te6edf3itemTb4b4b4(Te6edf3span Tff7b72= Tb4b4b4{ Te6edf3GridItemSpanTb4b4b4(Te6edf3maxLineSpanTb4b4b4) Tb4b4b4}Tb4b4b4, Te6edf3key Tff7b72= Te6edf3itemTb4b4b4.Te6edf3keyTb4b4b4) Tb4b4b4{ Te6edf3SectionHeaderTb4b4b4(Te6edf3title Tff7b72= Te6edf3itemTb4b4b4.Te6edf3titleTb4b4b4) Tb4b4b4}
Tff7b72is Te6edf3GridItemTb4b4b4.Te6edf3EmojiCell Tff7b72-Tff7b72>
Te6edf3itemTb4b4b4(Te6edf3key Tff7b72= Te6edf3itemTb4b4b4.Te6edf3keyTb4b4b4) Tb4b4b4{
Te6edf3EmojiCellWithSkinToneTb4b4b4(
Te6edf3emoji Tff7b72= Te6edf3itemTb4b4b4.Te6edf3emojiTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3selectedEmojisTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3itemTb4b4b4.Te6edf3emojiTb4b4b4.Te6edf3baseTb4b4b4)Tb4b4b4,
Te6edf3preferredSkinToneIndex Tff7b72= Te6edf3preferredSkinToneIndexTb4b4b4,
Te6edf3onSkinToneSelect Tff7b72= Te6edf3onSkinToneSelectTb4b4b4,
Te6edf3onSelect Tff7b72= Te6edf3onEmojiSelectedTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3gridItemsTb4b4b4.Te6edf3none Tb4b4b4{ Tffa657it Tff7b72is Te6edf3GridItemTb4b4b4.Te6edf3EmojiCell Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3itemTb4b4b4(Te6edf3span Tff7b72= Tb4b4b4{ Te6edf3GridItemSpanTb4b4b4(Te6edf3maxLineSpanTb4b4b4) Tb4b4b4}Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Ta5d6ff"Ta5d6ffNo emoji foundTa5d6ff"Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3bodyMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff3T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Grid Item Model โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tff7b72private Tff7b72sealed Tff7b72class T56d364GridItemTb4b4b4(Tff7b72open Tff7b72val Te6edf3keyTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Tff7b72data Tff7b72class T56d364HeaderTb4b4b4(Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4, Tff7b72override Tff7b72val Te6edf3keyTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4: Te6edf3GridItemTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72data Tff7b72class T56d364EmojiCellTb4b4b4(Tff7b72val Te6edf3emojiTb4b4b4: Te6edf3EmojiTb4b4b4, Tff7b72override Tff7b72val Te6edf3keyTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4: Te6edf3GridItemTb4b4b4(Te6edf3keyTb4b4b4)
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffbuildGridItemsTb4b4b4(
Te6edf3searchQueryTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3recentEmojisTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Te6edf3categoriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiCategoryTff7b72>Tb4b4b4,
Te6edf3allEmojisTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiTff7b72>Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3GridItemTff7b72> Tff7b72= Te6edf3buildList Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3searchQueryTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3query Tff7b72= Te6edf3searchQueryTb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3results Tff7b72= Te6edf3rankSearchResultsTb4b4b4(Te6edf3queryTb4b4b4, Te6edf3allEmojisTb4b4b4, Te6edf3recentEmojisTb4b4b4)
Te6edf3resultsTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3iTb4b4b4, Te6edf3emoji Tff7b72-Tff7b72> Te6edf3addTb4b4b4(Te6edf3GridItemTb4b4b4.Te6edf3EmojiCellTb4b4b4(Te6edf3emojiTb4b4b4, Ta5d6ff"Ta5d6ffsearch_Tffd700$Te6edf3iTa5d6ff"Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3recentEmojisTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(Te6edf3GridItemTb4b4b4.Te6edf3HeaderTb4b4b4(Ta5d6ff"Ta5d6ffRecently UsedTa5d6ff"Tb4b4b4, Te6edf3RECENTS_HEADER_KEYTb4b4b4)Tb4b4b4)
Te6edf3recentEmojisTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3iTb4b4b4, Te6edf3emojiStr Tff7b72-Tff7b72>
Te6edf3addTb4b4b4(Te6edf3GridItemTb4b4b4.Te6edf3EmojiCellTb4b4b4(Te6edf3EmojiTb4b4b4(Te6edf3emojiStrTb4b4b4)Tb4b4b4, Ta5d6ff"Tffd700$Te6edf3RECENTS_KEY_PREFIXTffd700$Te6edf3iTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3categoriesTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3catIndexTb4b4b4, Te6edf3category Tff7b72-Tff7b72>
Te6edf3addTb4b4b4(Te6edf3GridItemTb4b4b4.Te6edf3HeaderTb4b4b4(Te6edf3categoryTb4b4b4.Te6edf3nameTb4b4b4, Ta5d6ff"Tffd700$Te6edf3CATEGORY_HEADER_KEY_PREFIXTffd700$Te6edf3catIndexTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3categoryTb4b4b4.Te6edf3emojisTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3emojiIndexTb4b4b4, Te6edf3emoji Tff7b72-Tff7b72>
Te6edf3addTb4b4b4(Te6edf3GridItemTb4b4b4.Te6edf3EmojiCellTb4b4b4(Te6edf3emojiTb4b4b4, Ta5d6ff"Ta5d6ffcat_Tffd700${Te6edf3catIndexTffd700}Ta5d6ff_Tffd700$Te6edf3emojiIndexTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Ranks search results using prefix-weighted scoring (inspired by Signal's approach). Exact keyword matches score
* highest, then prefix matches, then substring matches. Recently-used emoji matching the query get a boost.
*/
Tff7b72private Tff7b72fun Td2a8ffrankSearchResultsTb4b4b4(Te6edf3queryTb4b4b4: Tffa657StringTb4b4b4, Te6edf3allEmojisTb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiTff7b72>Tb4b4b4, Te6edf3recentEmojisTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3EmojiTff7b72> Tb4b4b4{
Tff7b72val Te6edf3recentSet Tff7b72= Te6edf3recentEmojisTb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)
Tff7b72data Tff7b72class T56d364ScoredEmojiTb4b4b4(Tff7b72val Te6edf3emojiTb4b4b4: Te6edf3EmojiTb4b4b4, Tff7b72val Te6edf3scoreTb4b4b4: Tffa657FloatTb4b4b4)
Tff7b72return Te6edf3allEmojis
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3emoji Tff7b72-Tff7b72>
Tff7b72val Te6edf3score Tff7b72= Te6edf3scoreEmojiTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3queryTb4b4b4, Te6edf3recentSetTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3score Tff7b72> T79c0ff0fTb4b4b4) Te6edf3ScoredEmojiTb4b4b4(Te6edf3emojiTb4b4b4, Te6edf3scoreTb4b4b4) Tff7b72else Tff7b72null
Tb4b4b4}
Tb4b4b4.Te6edf3sortedByDescending Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3score Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3emoji Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72const Tff7b72val Te6edf3SCORE_EXACT_MATCH Tff7b72= T79c0ff1T79c0ff0f
Tff7b72private Tff7b72const Tff7b72val Te6edf3SCORE_PREFIX_MATCH Tff7b72= T79c0ff4f
Tff7b72private Tff7b72const Tff7b72val Te6edf3SCORE_SUBSTRING_MATCH Tff7b72= T79c0ff1f
Tff7b72private Tff7b72const Tff7b72val Te6edf3SCORE_BASE_CONTAINS Tff7b72= T79c0ff0.5f
Tff7b72private Tff7b72const Tff7b72val Te6edf3SCORE_RECENT_BOOST Tff7b72= T79c0ff3f
Tff7b72private Tff7b72fun Td2a8ffscoreEmojiTb4b4b4(Te6edf3emojiTb4b4b4: Te6edf3EmojiTb4b4b4, Te6edf3queryTb4b4b4: Tffa657StringTb4b4b4, Te6edf3recentSetTb4b4b4: Te6edf3SetTff7b72<Tffa657StringTff7b72>Tb4b4b4)Tb4b4b4: Tffa657Float Tb4b4b4{
Tff7b72var Te6edf3score Tff7b72= T79c0ff0f
Tff7b72for Tb4b4b4(Te6edf3keyword Tff7b72in Te6edf3emojiTb4b4b4.Te6edf3keywordsTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4{
Te6edf3keyword Tff7b72=Tff7b72= Te6edf3query Tff7b72-Tff7b72> Te6edf3score Tff7b72+Tff7b72= Te6edf3SCORE_EXACT_MATCH
Te6edf3keywordTb4b4b4.Te6edf3startsWithTb4b4b4(Te6edf3queryTb4b4b4) Tff7b72-Tff7b72> Te6edf3score Tff7b72+Tff7b72= Te6edf3SCORE_PREFIX_MATCH
Te6edf3keywordTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3queryTb4b4b4) Tff7b72-Tff7b72> Te6edf3score Tff7b72+Tff7b72= Te6edf3SCORE_SUBSTRING_MATCH
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3emojiTb4b4b4.Te6edf3baseTb4b4b4.Te6edf3containsTb4b4b4(Te6edf3queryTb4b4b4)Tb4b4b4) Te6edf3score Tff7b72+Tff7b72= Te6edf3SCORE_BASE_CONTAINS
Tff7b72if Tb4b4b4(Te6edf3score Tff7b72> T79c0ff0f Tff7b72&Tff7b72& Te6edf3emojiTb4b4b4.Te6edf3base Tff7b72in Te6edf3recentSetTb4b4b4) Te6edf3score Tff7b72+Tff7b72= Te6edf3SCORE_RECENT_BOOST
Tff7b72return Te6edf3score
Tb4b4b4}
T8b949e// โโ Cell Components โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSectionHeaderTb4b4b4(Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3titleTb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelMediumTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
T8b949e/**
* An emoji grid cell that supports:
* - **Tap** โ select the emoji with the user's preferred skin tone applied
* - **Long-press** โ if the emoji supports skin tones, show a popup with 6 Fitzpatrick variants
* - **Selected highlight** โ tinted background when the emoji is in [isSelected]
*/
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalFoundationApiTff7b72::Te6edf3classTb4b4b4)
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffEmojiCellWithSkinToneTb4b4b4(
Te6edf3emojiTb4b4b4: Te6edf3EmojiTb4b4b4,
Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3preferredSkinToneIndexTb4b4b4: Tffa657IntTb4b4b4,
Te6edf3onSkinToneSelectTb4b4b4: Tb4b4b4(Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Te6edf3onSelectTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3showSkinTonePopup Tff7b72by Te6edf3rememberSaveable Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3preferredTone Tff7b72= Te6edf3SkinToneTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3getOrElseTb4b4b4(Te6edf3preferredSkinToneIndexTb4b4b4) Tb4b4b4{ Te6edf3SkinToneTb4b4b4.Te6edf3DEFAULT Tb4b4b4}
Tff7b72val Te6edf3displayEmoji Tff7b72= Tff7b72if Tb4b4b4(Te6edf3emojiTb4b4b4.Te6edf3supportsSkinToneTb4b4b4) Te6edf3emojiTb4b4b4.Te6edf3withSkinToneTb4b4b4(Te6edf3preferredToneTb4b4b4) Tff7b72else Te6edf3emojiTb4b4b4.Te6edf3base
Te6edf3Box Tb4b4b4{
Te6edf3BoxTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(Te6edf3GRID_MIN_CELL_SIZETb4b4b4)
Tb4b4b4.Te6edf3clipTb4b4b4(Te6edf3RoundedCornerShapeTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3thenTb4b4b4(
Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Tb4b4b4{
Te6edf3ModifierTb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryContainerTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.6fTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3Modifier
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3combinedClickableTb4b4b4(
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onSelectTb4b4b4(Te6edf3displayEmojiTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3onLongClick Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3emojiTb4b4b4.Te6edf3supportsSkinToneTb4b4b4) Tb4b4b4{
Tb4b4b4{ Te6edf3showSkinTonePopup Tff7b72= Tff7b72true Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3displayEmojiTb4b4b4, Te6edf3fontSize Tff7b72= Te6edf3EMOJI_FONT_SIZETb4b4b4.Te6edf3spTb4b4b4, Te6edf3textAlign Tff7b72= Te6edf3TextAlignTb4b4b4.Te6edf3CenterTb4b4b4)
T8b949e// Small dot indicator for skin-tone-capable emoji
Tff7b72if Tb4b4b4(Te6edf3emojiTb4b4b4.Te6edf3supportsSkinToneTb4b4b4) Tb4b4b4{
Te6edf3BoxTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3alignTb4b4b4(Te6edf3AlignmentTb4b4b4.Te6edf3BottomEndTb4b4b4)
Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)
Tb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff6.Te6edf3dpTb4b4b4)
Tb4b4b4.Te6edf3backgroundTb4b4b4(Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceVariantTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.3fTb4b4b4)Tb4b4b4, Te6edf3CircleShapeTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3showSkinTonePopupTb4b4b4) Tb4b4b4{
Te6edf3SkinTonePopupTb4b4b4(
Te6edf3emoji Tff7b72= Te6edf3emojiTb4b4b4,
Te6edf3onSelect Tff7b72= Tb4b4b4{ Te6edf3variantTb4b4b4, Te6edf3toneIndex Tff7b72-Tff7b72>
Te6edf3showSkinTonePopup Tff7b72= Tff7b72false
Te6edf3onSkinToneSelectTb4b4b4(Te6edf3toneIndexTb4b4b4)
Te6edf3onSelectTb4b4b4(Te6edf3variantTb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3showSkinTonePopup Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Skin Tone Popup โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffSkinTonePopupTb4b4b4(Te6edf3emojiTb4b4b4: Te6edf3EmojiTb4b4b4, Te6edf3onSelectTb4b4b4: Tb4b4b4(Tffa657StringTb4b4b4, Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4, Te6edf3onDismissTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Te6edf3PopupTb4b4b4(Te6edf3alignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3TopCenterTb4b4b4, Te6edf3onDismissRequest Tff7b72= Te6edf3onDismissTb4b4b4) Tb4b4b4{
Te6edf3SurfaceTb4b4b4(
Te6edf3shape Tff7b72= Te6edf3RoundedCornerShapeTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceContainerTb4b4b4,
Te6edf3shadowElevation Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4,
Te6edf3border Tff7b72= Te6edf3BorderStrokeTb4b4b4(T79c0ff1.Te6edf3dpTb4b4b4, Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3outlineVariantTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff0.3fTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3widthInTb4b4b4(Te6edf3max Tff7b72= T79c0ff2T79c0ff8T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3spacedByTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3SkinToneTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3forEachIndexed Tb4b4b4{ Te6edf3indexTb4b4b4, Te6edf3tone Tff7b72-Tff7b72>
Tff7b72val Te6edf3variant Tff7b72= Te6edf3emojiTb4b4b4.Te6edf3withSkinToneTb4b4b4(Te6edf3toneTb4b4b4)
Te6edf3BoxTb4b4b4(
Te6edf3modifier Tff7b72=
Te6edf3ModifierTb4b4b4.Te6edf3sizeTb4b4b4(T79c0ff4T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3clipTb4b4b4(Te6edf3RoundedCornerShapeTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3clickable Tb4b4b4{ Te6edf3onSelectTb4b4b4(Te6edf3variantTb4b4b4, Te6edf3indexTb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(Te6edf3text Tff7b72= Te6edf3variantTb4b4b4, Te6edf3fontSize Tff7b72= T79c0ff2T79c0ff2.Te6edf3spTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Frequency Tracking โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tff7b72private Tff7b72const Tff7b72val Te6edf3SPLIT_CHAR Tff7b72= Ta5d6ff"Ta5d6ff,Ta5d6ff"
Tff7b72private Tff7b72const Tff7b72val Te6edf3KEY_VALUE_DELIMITER Tff7b72= Ta5d6ff"Ta5d6ff=Ta5d6ff"
Tff7b72internal Tff7b72fun Td2a8ffparseRecentsTb4b4b4(Te6edf3rawTb4b4b4: Tffa657String?Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3isNullOrBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3rawTb4b4b4.Te6edf3splitTb4b4b4(Te6edf3SPLIT_CHARTb4b4b4)
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3entry Tff7b72-Tff7b72>
Te6edf3entry
Tb4b4b4.Te6edf3splitTb4b4b4(Te6edf3KEY_VALUE_DELIMITERTb4b4b4, Te6edf3limit Tff7b72= T79c0ff2Tb4b4b4)
Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff2 Tb4b4b4}
Tff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTff7b72[T79c0ff0Tff7b72] Te6edf3to Tb4b4b4(Tffa657itTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3sortedByDescending Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3second Tb4b4b4}
Tb4b4b4.Te6edf3takeTb4b4b4(Te6edf3MAX_RECENTSTb4b4b4)
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3first Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffrecordSelectionTb4b4b4(Te6edf3emojiTb4b4b4: Tffa657StringTb4b4b4, Te6edf3viewModelTb4b4b4: Te6edf3EmojiPickerViewModelTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3raw Tff7b72= Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequency
Tff7b72val Te6edf3freq Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3rawTb4b4b4.Te6edf3isNullOrBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3mutableMapOfTb4b4b4(Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3rawTb4b4b4.Te6edf3splitTb4b4b4(Te6edf3SPLIT_CHARTb4b4b4)
Tb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Te6edf3entry Tff7b72-Tff7b72>
Te6edf3entry
Tb4b4b4.Te6edf3splitTb4b4b4(Te6edf3KEY_VALUE_DELIMITERTb4b4b4, Te6edf3limit Tff7b72= T79c0ff2Tb4b4b4)
Tb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3size Tff7b72=Tff7b72= T79c0ff2 Tb4b4b4}
Tff7b72?.Te6edf3let Tb4b4b4{ Tffa657itTff7b72[T79c0ff0Tff7b72] Te6edf3to Tb4b4b4(Tffa657itTff7b72[T79c0ff1Tff7b72]Tb4b4b4.Te6edf3toIntOrNullTb4b4b4(Tb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3toMapTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toMutableMapTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3freqTff7b72[Te6edf3emojiTff7b72] Tff7b72= Tb4b4b4(Te6edf3freqTff7b72[Te6edf3emojiTff7b72] Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72+ T79c0ff1
Te6edf3viewModelTb4b4b4.Te6edf3customEmojiFrequency Tff7b72=
Te6edf3freqTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3joinToStringTb4b4b4(Te6edf3SPLIT_CHARTb4b4b4) Tb4b4b4{ Ta5d6ff"Tffd700${Tffa657itTb4b4b4.Te6edf3keyTffd700}Tffd700$Te6edf3KEY_VALUE_DELIMITERTffd700${Tffa657itTb4b4b4.Te6edf3valueTffd700}Ta5d6ff" Tb4b4b4}
Tb4b4b4}
T8b949e// โโ Previews โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Tff7b72private Tff7b72val Te6edf3PREVIEW_CATEGORIES Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3EmojiCategoryTb4b4b4(
Ta5d6ff"Ta5d6ffSmileys & EmotionTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4,
Te6edf3listOfTb4b4b4(
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffgrinningTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsmileyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffaceTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhappyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhappyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffjoyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffgrinTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhappyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6fflaughingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsatisfiedTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐
Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffsweatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhotTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐คฃTa5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffroflTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflaughingTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffloorTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffjoyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftearsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflaughTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffslightlyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffwinkTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffaceTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffblushTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhappyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffangelTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffinnocentTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhaloTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3EmojiCategoryTb4b4b4(
Ta5d6ff"Ta5d6ffPeople & BodyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4,
Te6edf3listOfTb4b4b4(
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffwaveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhandTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐คTa5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffraisedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbackTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhandTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐๏ธTa5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffhandTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsplayedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffingersTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ffโTa5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffhandTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhigh fiveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstopTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffthumbs upTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapproveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffyesTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffthumbs downTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdisapproveTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnoTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffclapTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffapplauseTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Te6edf3EmojiTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ffraisedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhandsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcelebrationTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3supportsSkinTone Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUnusedPrivateMemberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPreviewPublicTa5d6ff"Tb4b4b4)
Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72fun Td2a8ffEmojiPickerContentPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3EmojiPickerContentTb4b4b4(
Te6edf3searchQuery Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3debouncedQuery Tff7b72= Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3onSearchQueryChange Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3selectedCategoryIndex Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3onCategorySelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3selectedEmojis Tff7b72= Te6edf3setOfTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3recentEmojis Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffโค๏ธTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐ฅTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3categories Tff7b72= Te6edf3PREVIEW_CATEGORIESTb4b4b4,
Te6edf3allEmojis Tff7b72= Te6edf3PREVIEW_CATEGORIESTb4b4b4.Te6edf3flatMap Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3emojis Tb4b4b4}Tb4b4b4,
Te6edf3preferredSkinToneIndex Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3onSkinToneSelect Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onEmojiSelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUnusedPrivateMemberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffPreviewPublicTa5d6ff"Tb4b4b4)
Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72fun Td2a8ffEmojiPickerSearchPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3AppTheme Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3EmojiPickerContentTb4b4b4(
Te6edf3searchQuery Tff7b72= Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4,
Te6edf3debouncedQuery Tff7b72= Ta5d6ff"Ta5d6ffsmileTa5d6ff"Tb4b4b4,
Te6edf3onSearchQueryChange Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3selectedCategoryIndex Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3onCategorySelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3selectedEmojis Tff7b72= Te6edf3emptySetTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3recentEmojis Tff7b72= Te6edf3listOfTb4b4b4(Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffโค๏ธTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff๐Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3categories Tff7b72= Te6edf3PREVIEW_CATEGORIESTb4b4b4,
Te6edf3allEmojis Tff7b72= Te6edf3PREVIEW_CATEGORIESTb4b4b4.Te6edf3flatMap Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3emojis Tb4b4b4}Tb4b4b4,
Te6edf3preferredSkinToneIndex Tff7b72= T79c0ff0Tb4b4b4,
Te6edf3onSkinToneSelect Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onEmojiSelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.22s